/**
 * @Author:  renyc
 * @Date: 2022年12月23日16:47:47
 */

import * as Cesium from 'cesium/Cesium';

class GPlatesTerrainProvider{// extends Cesium.TerrainProvider{
    constructor(options){

        this._name = options.name || "DNS",
        this._maxLevel = options.maxLevel || 7,
        this._ready = !0,
        this._errorEvent = new Cesium.Event,
        this._creditText = options.creditText || "",
        this._creditText && (this._credit = new Cesium.Credit(this._creditText)),
        this._tilingScheme = new Cesium.GeographicTilingScheme({
            numberOfLevelZeroTilesX: 2,
            numberOfLevelZeroTilesY: 1
        }),
        this._levelZeroMaximumGeometricError = Cesium.TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this._tilingScheme.ellipsoid, 65, this._tilingScheme.getNumberOfXTilesAtLevel(0)),
        this._terrainDataStructure = {
            heightScale: 1,
            heightOffset: 0,
            elementsPerHeight: 1,
            stride: 1,
            elementMultiplier: 256,
            isBigEndian: !1
        }
    }

    get errorEvent() {
        return this._errorEvent;
    }

    get credit() {
        return this._credit;
    }

    get tilingScheme(){
        return this._tilingScheme;
    }

    get ready(){
        return this._ready;
    }

    //function(e, t, i, r) {
    // requestTileGeometry(x, y, level, request){
    //     var e = x;
    //     var t = y;
    //     var i = level;
    //     var r = request;
    //     if (!this._ready){
    //         throw new DeveloperError("requestTileGeometry must not be called before the imagery provider is ready.");
    //     }
    //     if (this.getTileDataAvailable(e, t, i)) {
    //         var o = "/get_terrain/?x={x}&y={y}&z={z}&name=" + this._name
    //             , a = o.replace("{x}", e);
    //             a = a.replace("{y}", Math.abs(t - (Math.pow(2, i) - 1))),
    //             a = a.replace("{z}", i);
    //         var n = this;
    //         return Cesium.when(Cesium.loadArrayBuffer(a, {
    //                 Accept: "application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"
    //             }), function(e) {
    //                 var t = new Int16Array(e, 0, 4225);
    //                 return new Cesium.HeightmapTerrainData({
    //                     buffer: t,
    //                     width: 65,
    //                     height: 65,
    //                     waterMask: new Uint8Array(e,t.byteLength + 1,e.byteLength - t.byteLength - 1),
    //                     structure: n._terrainDataStructure
    //                 })
    //             });
    //     }
    // }

    /**
     * 2022-12-25
     * @param {} x 
     * @param {*} y 
     * @param {*} level 
     * @param {*} request 
     * @returns 
     */
    // requestTileGeometry(x, y, level, request){
    //     var e = x;
    //     var t = y;
    //     var i = level;
    //     var r = request;
    //     if (!this._ready){
    //         throw new DeveloperError("requestTileGeometry must not be called before the imagery provider is ready.");
    //     }
    //     if (this.getTileDataAvailable(e, t, i)) {
    //         var o = "/get_terrain/?x={x}&y={y}&z={z}&name=" + this._name
    //             , tile_url = o.replace("{x}", e);
    //             tile_url = tile_url.replace("{y}", Math.abs(t - (Math.pow(2, i) - 1))),
    //             tile_url = tile_url.replace("{z}", i);
    //         var that = this;

    //         console.log("[url]:" + tile_url);

    //         // var tileResource = this._resource.getDerivedResource({
    //         //     url: "tile/" + level + "/" + y + "/" + x,
    //         //     request: request,
    //         //   });

    //         // const resource = new Resource({
    //         //     url: 'http://server.com/path/to/resource.json',
    //         //     proxy: new DefaultProxy('/proxy/'),
    //         //     headers: {
    //         //       'X-My-Header': 'valueOfHeader'
    //         //     },
    //         //     queryParameters: {
    //         //       'access_token': '123-435-456-000'
    //         //     },
    //         //     retryCallback: refreshTokenRetryCallback,
    //         //     retryAttempts: 1
    //         //  });

    //         let tileResource = new Cesium.Resource({
    //             url: tile_url,
    //             headers: {
    //                 Accept: "application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"
    //             }
    //         });
    //         let promise = tileResource.fetchArrayBuffer();
    //         var availabilityPromise = Cesium.when.resolve(true);

    //         return Cesium.when.join(promise, availabilityPromise)
    //             .then(function(e) {
    //                 var t = new Int16Array(e, 0, 4225);
    //                 return new Cesium.HeightmapTerrainData({
    //                     buffer: t,
    //                     width: 65,
    //                     height: 65,
    //                     waterMask: new Uint8Array(e,t.byteLength + 1,e.byteLength - t.byteLength - 1),
    //                     structure: that._terrainDataStructure
    //                 })
    //             }).otherwise(function (error) {
    //                 console.log(error);
    //                 return Cesium.when.reject(error);
    //             });

    //         // return Cesium.when(promise, function(e) {
    //         //         var t = new Int16Array(e, 0, 4225);
    //         //         return new Cesium.HeightmapTerrainData({
    //         //             buffer: t,
    //         //             width: 65,
    //         //             height: 65,
    //         //             waterMask: new Uint8Array(e,t.byteLength + 1,e.byteLength - t.byteLength - 1),
    //         //             structure: that._terrainDataStructure
    //         //         })
    //         //     });

    //         // return Cesium.when(Cesium.loadArrayBuffer(a, {
    //         //         Accept: "application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"
    //         //     }), function(e) {
    //         //         var t = new Int16Array(e, 0, 4225);
    //         //         return new Cesium.HeightmapTerrainData({
    //         //             buffer: t,
    //         //             width: 65,
    //         //             height: 65,
    //         //             waterMask: new Uint8Array(e,t.byteLength + 1,e.byteLength - t.byteLength - 1),
    //         //             structure: n._terrainDataStructure
    //         //         })
    //         //     });
    //     }

    requestTileGeometry(x, y, level, request){
        // var e = x;
        // var t = y;
        // var i = level;
        // var r = request;
        // if (!this._ready){
        //     throw new DeveloperError("requestTileGeometry must not be called before the imagery provider is ready.");
        // }
        // if (this.getTileDataAvailable(e, t, i)) {
        //     var o = "/get_terrain/?x={x}&y={y}&z={z}&name=" + this._name
        //         , tile_url = o.replace("{x}", e);
        //         tile_url = tile_url.replace("{y}", Math.abs(t - (Math.pow(2, i) - 1))),
        //         tile_url = tile_url.replace("{z}", i);
        //     var that = this;

        //     console.log("[url]:" + tile_url);

        //     // var tileResource = this._resource.getDerivedResource({
        //     //     url: "tile/" + level + "/" + y + "/" + x,
        //     //     request: request,
        //     //   });

        //     // const resource = new Resource({
        //     //     url: 'http://server.com/path/to/resource.json',
        //     //     proxy: new DefaultProxy('/proxy/'),
        //     //     headers: {
        //     //       'X-My-Header': 'valueOfHeader'
        //     //     },
        //     //     queryParameters: {
        //     //       'access_token': '123-435-456-000'
        //     //     },
        //     //     retryCallback: refreshTokenRetryCallback,
        //     //     retryAttempts: 1
        //     //  });

        //     let tileResource = new Cesium.Resource({
        //         url: tile_url,
        //         headers: {
        //             Accept: "application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"
        //         },
        //         request : request
        //     });
        //     let promise = tileResource.fetchArrayBuffer();
        //     var availabilityPromise = Cesium.when.resolve(true);

        //     return promise.then()


        //     // return Cesium.when(promise, function(e) {
        //     //         var t = new Int16Array(e, 0, 4225);
        //     //         return new Cesium.HeightmapTerrainData({
        //     //             buffer: t,
        //     //             width: 65,
        //     //             height: 65,
        //     //             waterMask: new Uint8Array(e,t.byteLength + 1,e.byteLength - t.byteLength - 1),
        //     //             structure: that._terrainDataStructure
        //     //         })
        //     //     });

        //     // return Cesium.when(Cesium.loadArrayBuffer(a, {
        //     //         Accept: "application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"
        //     //     }), function(e) {
        //     //         var t = new Int16Array(e, 0, 4225);
        //     //         return new Cesium.HeightmapTerrainData({
        //     //             buffer: t,
        //     //             width: 65,
        //     //             height: 65,
        //     //             waterMask: new Uint8Array(e,t.byteLength + 1,e.byteLength - t.byteLength - 1),
        //     //             structure: n._terrainDataStructure
        //     //         })
        //     //     });
        // }
    }

    hasWaterMask(){
        return !1;
    }

    getLevelMaximumGeometricError(e) {
        return this._levelZeroMaximumGeometricError / (1 << e);
    }

    getTileDataAvailable(e, t, i) {
        return !(i > this._maxLevel)
    }
}

export default GPlatesTerrainProvider